package cipher.algorithm;

import java.util.ArrayList;

public class LFSR_8 extends Algorithm {

	/*
	 * Optimisation:
	 * boucles invers�es
	 * instancier les variables les plus utilis�es au d�but
	 * les applets de fonctions ne coutent rien
	 * stocker les variables si r�utilis�es plusieurs fois
	 * les objets static sont acc�d�s plus rapidement
	 * les objets locaux sont acc�d�s plus rapidement
	 * */
	
	private int registre;
	private int retroaction;

	public LFSR_8(int registre, int retroaction) {
		super();
		this.registre = registre;
		this.retroaction = retroaction;
		setKEY_LENGTH(16);
	}
	
	@Override
	public int generateNextNumber() {
		int b = 0;
		int c = registre;

		for(int j=getKEY_LENGTH();--j>=0;) {
			b = readBit(c, 0);
			
			for(int i=getKEY_LENGTH();--i>=0;)
				if(readBit(retroaction, i) == 1)
					b = b^readBit(c, i);
			
			b = b<<getKEY_LENGTH()-1;
			c = (c>>1) | b;
		}
		// ne retourner qu'un bit, puis les concatener dans le buffer avec addBitLE

		registre = c;
		return c;
	}
	
	public int generateNextNumber(int length) {
		int b = 0;
		int c = registre;

		for(int j=getKEY_LENGTH();--j>=0;) {
			b = readBit(c, 0);
			
			for(int i=getKEY_LENGTH();--i>=0;)
				if(readBit(retroaction, i) == 1)
					b = b^readBit(c, i);
			
			b = b<<getKEY_LENGTH()-1;
			c = (c>>1) | b;
		}
		// ne retourner qu'un bit, puis les concatener dans le buffer avec addBitLE

		registre = c;
		return c;
	}
	
	public ArrayList<String> generateNewKey(int keySize){	return null;	}
	
	public int getRegistre() { return registre; }
	public void setRegistre(int registre) { this.registre = registre; }

	public int getRetroaction() { return retroaction; }
	public void setRetroaction(int retroaction) { this.retroaction = retroaction; }

	@Override
	public String toString() { return Integer.toBinaryString(getRegistre())+Integer.toBinaryString(getRetroaction()); }
	
}
